#ifndef ttable_h
#define ttable_h

#include <move.h>
#include <stdint.h>

#define TT_EMPTY 0
#define TT_EXACT 1
#define TT_BETA 2
#define TT_ALPHA 4


typedef uint64_t hash_key_t;

struct position_t;  // forward declaration


// side/piece/square/key-tag
extern hash_key_t zobrist_keys[2][6][64][2];
extern hash_key_t side_hash_keys[2];


typedef struct ttable_entry_t
{
  move_t best;
  int16_t score;
  uint8_t flags;
  uint8_t depth;
} ttable_entry_t;


void ttable_init();
int ttable_resize(long mbytes);
void ttable_reset();
void ttable_cleanup();

int ttable_probe(const struct position_t* pos,
		 ttable_entry_t* entry);
void ttable_insert(const struct position_t* pos,
		   const ttable_entry_t* entry);
void ttable_print_stats();


#endif  // ttable_h
